#ifndef CLIENTMESSAGEHANDLER_H
#define CLIENTMESSAGEHANDLER_H

#include <QObject>
#include <QDateTime>
#include "./entities/constants.h"

class ClientMessageHandler: public QObject
{
    Q_OBJECT
public:
    static ClientMessageHandler& getInstance();

    ClientMessageHandler(ClientMessageHandler&) = delete;
    ClientMessageHandler& operator=(const ClientMessageHandler&) = delete;

public slots:
    /* ui线程发送来的数据 */
    void sendLoginRequestMessage(const QString userId, const QString password);
    void sendRegisterRequestMessage(const QString email, const QString nickname, const QString password);
    void sendLogoutRequestMessage(const QString userId);
    void sendSearchNewUserRequestMessage(const QString newUserId);
    void sendApplyFriendRequestMessage(const QString userId, const QString friendId,
                                       const QString alias, const QString verifyInfo);
    void sendRequestBufferDataMessage(QString userId);
    void sendApplyFriendResponseMessage(const FriendVerifyStatus status, const QString alias, const int id);
    void sendChatMessage(const QString userId, const QString friendId,
                         const QString msg, const QDateTime sendTime);
    // 发送视频通话请求
    void sendVideoRequestMessage(const QString userId,
                                 const QString userIp, const QString friendId);
    // 发送视频通话请求回复结果
    void sendVideoResponseMessge(const UserId responseUserId,
        const FriendId requestUserId, const Status status, const Ip responseUserIp);

    /* 从tcp线程接受数据 */
    void handleByteData(const QByteArray);

private:
    explicit ClientMessageHandler(QObject *parent = nullptr);
    ~ClientMessageHandler();

    static ClientMessageHandler m_instance;
    void handleMessage(const QByteArray&);
    void handleImage(const QByteArray&);

signals:
    /* 发给tcp线程 */
    void dataReadyToSend(const QByteArray);
    /* 发给UI */
    void getLoginResponse(const QString status, const QString reason);  // 发给LoginWidget
    void getRegisterResponse(const QString status, const QString reason, const QString userId); // 发给RegisterDialog
    void getLogoutResponse(const QString status, const QString reason); // 发给MainWindow
    void getSearchUserResponse(const QString status, const QString reason,  // 发给MainWindow
                               const QString userId, const QString nickname);
    void getApplyFriendRequestToClient(const QString receiverId, const QString applicantId,
                const QString nickname, const QString verifyInfo,
                const QDateTime applyTime, const int id);   // 发给MainWindow和DBService
    void getApplyFriendResponseToClient(const QString friendId, const QString nickname,
        const QString status, const QString alias, const QDateTime resultTime);   // 发给MainWindow和DBService
    void getNewChatMsg(const QString friendId, const QString msg, const QDateTime sendTime);
    // 收到其他用户视频通话请求
    void getVideoRequest(const QString requestUserId, const QString requestUserIp);
    // 收到其他用户视频通话请求回复
    void getVideoResponse(const QString requestUserId, const QString responseUserId,
        const QString status, const QString responseUserIp);

};

#endif // CLIENTMESSAGEHANDLER_H
